home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Free Software Collection: Marty 1
/
FM Towns Marty 1 Free Software Collection.iso
/
tool
/
book
/
src
/
init.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-11-11
|
10KB
|
327 lines
/*
* 初期化に使うルーチン
* char *param(char *path)
* パラメータがパスリストだったら、そのディレクトリに移動する
* void configuration(char *fname)
* 定義ファイルを読み、定義値を変数にセットする
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <egb.h>
#include <mos.h>
#include <fmc.h>
#include "menu_evt.h"
#include "init.h"
#include "book.h"
#include "lib.h"
#include "doslib.h"
setup_t setup = /* セットアップ情報 */
{
NULL, /* char *onsei_dic; : ONSEI.DIC のパス */
/* paltbl_t palette; : 画面の色情報 */
{ 8, { 10, 255,255,255 }, { 9, 255, 0,255 }, { 8, 31, 31, 31 },
{ 11, 0,255,255 }, { 2, 255,255,255 }, { 3, 63, 63, 63 },
{ 1, 0, 0, 0 }, {13, 0,127, 0 }, {14, 127,127, 0 }},
/* ファイルセレクタ */
SORT_NAME, /* SORT sort_mode; : ソート方式 */
1, /* short fs_mode; : 段組表示数 */
/* テキスト表示 */
TAB_DEF, /* short tabsiz; : ハード・タブ間隔 */
TRUE, /* short disp_cr; : 改行記号の表示有無 */
TRUE, /* short disp_ctrl; : 制御文字を可視化する */
0, /* short dpl_mode; : 行間隔モード */
32, /* short btn_speed; : 定速スクロールボタンの速度 */
FALSE, /* short caps; : 検索時英大小文字区別 */
/* リピート時間 */
20, /* short repstart; : キーリピート開始時間 (1=20ms) */
1, /* short repeat; : キーリピート間隔 (1=20ms) */
20, /* short db_click; : ダブルクリック検出 (1=20ms) */
};
/* config ファイルの読み込み */
typedef enum {prm_DIGIT, prm_STRING, prm_MULTI} ptype_t;
typedef enum {cmd_tabsize, cmd_dispcr, cmd_ctrl,
cmd_backpal, cmd_textpal, cmd_crpal, cmd_ctrlpal,
cmd_sortkey, cmd_wildc, cmd_onsei, cmd_excmd,
cmd_dpl, cmd_btn, cmd_caps, cmd_fsmode,
cmd_end} cmd_t;
typedef struct
{
cmd_t code;
char *cmd;
ptype_t ptype;
} param_t;
static const param_t prm[] =
{
cmd_tabsize,"TAB_SIZE", prm_DIGIT, /* タブサイズ */
cmd_dispcr, "DISP_CR", prm_DIGIT, /* 改行表示 */
cmd_ctrl, "FORM_CTRL", prm_DIGIT, /* 制御文字整形 */
cmd_dpl, "DOT/LINE", prm_DIGIT, /* 行間隔 */
cmd_btn, "BTN_SPEED", prm_DIGIT, /* 定速ボタンの速度 */
cmd_caps, "CAPS", prm_DIGIT, /* 英大小文字区別 */
cmd_onsei, "ONSEI", prm_STRING, /* ONSEI.DICのパス */
cmd_sortkey,"SORT_KEY", prm_DIGIT, /* ソートキー */
cmd_wildc, "WILD_CARD", prm_STRING, /* 追加ワイルド・カード */
cmd_fsmode, "FS_MODE", prm_DIGIT, /* ファイルセレクタの段組み */
cmd_excmd, "DOS_CMD", prm_STRING, /* 外部コマンド起動 */
cmd_backpal,"BACK_PAL", prm_MULTI, /* 背景色 B,R,G */
cmd_textpal,"TEXT_PAL", prm_MULTI, /* 文字色 B,R,G */
cmd_crpal, "CR_PAL", prm_MULTI, /* 改行色 B,R,G */
cmd_ctrlpal,"CTRL_PAL", prm_MULTI, /* 制御色 B,R,G */
cmd_end, NULL, prm_DIGIT, /* 終わり */
} ;
static param_t *search_cmd(char *cmd_str)
{
param_t *pp;
char *cmd = strdup(cmd_str);
jstrupr(cmd);
for (pp = (param_t *)&prm; pp->cmd != NULL; pp++)
if (strcmp(cmd, pp->cmd) == 0)
break;
free(cmd);
return pp;
}
static char *param_ptr = NULL;
#define prm_setpos(a) (param_ptr = a)
static int getvalue(int default_value)
{
int return_value;
if (param_ptr == NULL || *param_ptr == '\0' || !isdigit(*param_ptr))
return_value = default_value;
else
{
return_value = atoi(param_ptr);
while (*param_ptr && isdigit(*param_ptr)) param_ptr++;
while (*param_ptr && !isdigit(*param_ptr)) param_ptr++;
}
return return_value;
}
static void cnv_palette(pal_t *pal)
{
pal->b = getvalue(pal->b);
pal->r = getvalue(pal->r);
pal->g = getvalue(pal->g);
}
#define MAX_LINE_LEN 2048 /* 継続行の最大長 */
void configuration(char *fname)
{
FILE *fp;
char buf[MAX_LINE_LEN+1];
char *p, *prm1, *prm2;
int tmp;
param_t *cmd;
int fileread(FILE *fp, char *buf, int maxlen)
{
char *p, filebuf[256];
int len, all_len=0;
*buf = '\0', all_len = 0;
while (TRUE)
{
fgets(filebuf, 255, fp);
if (feof(fp))
break;
if ((len = strlen(filebuf)) < 2)
break;
len--;
*(filebuf+len) = '\0'; /* 改行をつぶす */
if (all_len + len > maxlen)
break;
_strcats(maxlen, buf, " ", skipbl(filebuf), NULL);
all_len = strlen(buf);
if (*(p = buf+all_len-1) != '\\') /* 継続行 */
break;
*p = '\0';
}
return feof(fp);
}
if ((fp = fopen(fname, "r")) == NULL)
return;
while (!fileread(fp, buf, MAX_LINE_LEN))
{
prm1 = skipbl(buf); /* 第一パラメータの頭だし */
if (*prm1 == '\0' || *prm1 == '#') /* 注釈か空行ならスキップ */
continue; /* ならば、パス */
prm2 = skipbl(skipwd(prm1)); /* 第二パラメータの頭だし */
if (*prm2 == '\0' || *prm2 == '#') /* 第二パラメータ以降なし */
continue; /* ならば、パス */
*(skipwd(prm1)) = '\0'; /* 第一パラメータの終端セット */
cmd = search_cmd(prm1); /* コマンド? */
if (cmd->cmd == NULL) /* 違うならパス */
continue;
switch(cmd->ptype) /* 第二パラメータを検査 */
{
case prm_MULTI: /* 複数 数値型 */
prm_setpos(prm2);
case prm_DIGIT: /* 数値型 */
if (!isdigit(*prm2)) /* 第二パラメータは数値? */
continue; /* 違ったら、パス */
else
tmp = atoi(prm2); /* 第二パラメータを数値変換 */
break;
case prm_STRING: /* 文字型 */
break;
}
/* コマンドに応じた処理 */
switch(cmd->code)
{
case cmd_tabsize: /* タブサイズ */
if (tmp==0 || tmp==1 || tmp==4 || tmp==8)
setup.tabsiz = tmp;
break;
case cmd_dispcr: /* 改行記号の表示 */
if (tmp == 0 || tmp == 1)
setup.disp_cr = tmp;
break;
case cmd_ctrl: /* 制御文字の整形表示 */
if (tmp == 0 || tmp == 1)
setup.disp_ctrl = tmp;
break;
case cmd_sortkey: /* ソートキーの指定 */
if (tmp == 0 || tmp == 1 || tmp == 2)
setup.sort_mode = tmp;
break;
case cmd_wildc: /* 追加ワイルドカード */
*(skipwd(prm2)) = '\0'; /* 第二パラメータの終端セット */
wc_apend(prm2, FALSE);
break;
case cmd_fsmode: /* ファイルセレクタの段組み */
if (tmp == 1 || tmp == 2)
setup.fs_mode = tmp;
break;
case cmd_dpl: /* 行間隔 */
if (tmp == 0 || tmp == 1 || tmp == 2)
setup.dpl_mode = tmp;
break;
case cmd_btn: /* 定速スクロールボタン速度 */
if (tmp > 0)
setup.btn_speed = tmp;
break;
case cmd_caps: /* 大小文字の区別 */
if (tmp == 0 || tmp == 1)
setup.caps = tmp;
break;
case cmd_excmd: /* 外部コマンド */
p = prm2;
do {
prm1 = p;
p = skipbl(skipwd(prm1));
} while(*p != '\0' && *p != '#');
*(skipwd(prm1)) = '\0';
excmd_apend(prm2);
break;
case cmd_onsei: /* ONSEI.DIC のパスリスト */
*(skipwd(prm2)) = '\0'; /* 第二パラメータの終端セット */
setup.onsei_dic = strdup(prm2);
break;
case cmd_backpal:
cnv_palette(&setup.palette.back);
break;
case cmd_textpal:
cnv_palette(&setup.palette.text);
break;
case cmd_crpal:
cnv_palette(&setup.palette.cr);
break;
case cmd_ctrlpal:
cnv_palette(&setup.palette.ctrl);
break;
}
}
fclose(fp);
}
/* パラメータとしてファイルが指定されていたら、
そのドライブ・ディレクトリへ移動し、フルパスリストを作る */
char *param(char *file)
{
static char crrdir[256];
REGS char *p, *fname;
if (file == NULL || *file == '\0') /* 空のファイル名 */
return NULL;
if (isalpha(*file) && *(file+1) == ':') /* ドライブ名の指定 */
{
chdrv(toupper(*file) - 'A');
file += 2;
}
if ((p = jstrrchr(file, '\\')) != NULL) /* ディレクトリ指定あり */
{
if (p > file) /* ディレクトリ名だけを分離 */
{
*p = '\0';
chdir(file);
}
else /* ディレクトリ名はルート */
chdir("\\");
fname = p + 1;
}
else /* ディレクトリ指定なし */
fname = file;
getdir(crrdir); /* カレントまでのフルパス */
strcat(crrdir, fname); /* カレントファイルのフルパスできあがり */
jstrupr(crrdir);
return crrdir;
}